﻿package core.image.encoder
{
    import flash.display.*;
    import flash.utils.*;

    public class PNGEncoder extends Object
    {
        private static var crcTable:Array;
        private static var crcTableComputed:Boolean = false;

        public function PNGEncoder()
        {
            return;
        }// end function

        public function encode(_local10:BitmapData) : ByteArray
        {
            var _loc_2:uint = 0;
            var _loc_3:int = 0;
            var _loc_7:int = 0;
            var _loc_4:* = new ByteArray();
            _loc_4.writeUnsignedInt(2303741511);
            _loc_4.writeUnsignedInt(218765834);
            var _loc_5:* = new ByteArray();
            _loc_5.writeInt(_local10.width);
            _loc_5.writeInt(_local10.height);
            _loc_5.writeUnsignedInt(134610944);
            _loc_5.writeByte(0);
            writeChunk(_loc_4, 1229472850, _loc_5);
            var _loc_6:* = new ByteArray();
            while (_loc_7 < _local10.height)
            {
                
                _loc_6.writeByte(0);
                if (!_local10.transparent)
                {
                    _loc_3 = 0;
                    while (_loc_3 < _local10.width)
                    {
                        
                        _loc_2 = _local10.getPixel(_loc_3, _loc_7);
                        _loc_6.writeUnsignedInt(uint((_loc_2 & 16777215) << 8 | 255));
                        _loc_3++;
                    }
                }
                else
                {
                    _loc_3 = 0;
                    while (_loc_3 < _local10.width)
                    {
                        
                        _loc_2 = _local10.getPixel32(_loc_3, _loc_7);
                        _loc_6.writeUnsignedInt(uint((_loc_2 & 16777215) << 8 | _loc_2 >>> 24));
                        _loc_3++;
                    }
                }
                _loc_7++;
            }
            _loc_6.compress();
            writeChunk(_loc_4, 1229209940, _loc_6);
            writeChunk(_loc_4, 1229278788, null);
            return _loc_4;
        }// end function

        private static function writeChunk(_local9:ByteArray, _local9:uint, _local9:ByteArray) : void
        {
            var _loc_4:uint = 0;
            var _loc_5:uint = 0;
            var _loc_6:uint = 0;
            var _loc_7:uint = 0;
            var _loc_10:int = 0;
            if (!crcTableComputed)
            {
                crcTableComputed = true;
                crcTable = [];
                _loc_5 = 0;
                while (_loc_5 < 256)
                {
                    
                    _loc_4 = _loc_5;
                    _loc_6 = 0;
                    while (_loc_6 < 8)
                    {
                        
                        if (_loc_4 & 1)
                        {
                            _loc_4 = uint(uint(3988292384) ^ uint(_loc_4 >>> 1));
                        }
                        else
                        {
                            _loc_4 = uint(_loc_4 >>> 1);
                        }
                        _loc_6 = _loc_6 + 1;
                    }
                    crcTable[_loc_5] = _loc_4;
                    _loc_5 = _loc_5 + 1;
                }
            }
            if (_local9 != null)
            {
                _loc_7 = _local9.length;
            }
            _local9.writeUnsignedInt(_loc_7);
            var _loc_8:* = _local9.position;
            _local9.writeUnsignedInt(_local9);
            if (_local9 != null)
            {
                _local9.writeBytes(_local9);
            }
            var _loc_9:* = _local9.position;
            _local9.position = _loc_8;
            _loc_4 = 4294967295;
            while (_loc_10 < _loc_9 - _loc_8)
            {
                
                _loc_4 = uint(crcTable[(_loc_4 ^ _local9.readUnsignedByte()) & uint(255)] ^ uint(_loc_4 >>> 8));
                _loc_10++;
            }
            _loc_4 = uint(_loc_4 ^ uint(4294967295));
            _local9.position = _loc_9;
            _local9.writeUnsignedInt(_loc_4);
            return;
        }// end function

    }
}
